package com.cn.ycy.beanreference;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class A {

  @Autowired
  A a;

  @Transactional(rollbackFor = Exception.class)
  public void test1() {
    this.a.pay1();
  }

  /**
   * 这个方法，会导致 a对象中的属性为null
   */
  @Transactional(rollbackFor = Exception.class)
  public void test2() {
    this.a.pay2();
  }

  /**
   * 作用域不同 private、public，前者会导致npx
   * 使用 private 会调用代理对象方法，代理对象的属性值都是null
   *
   * 原因：
   *  代理类对象中属性都是null, cglib 代理类 直接继承 被代理类，并重写了代理类方法，重写的方法中会调用被代理类对象的方法。
   *  因为父类是的private方法，所以无法重写，父类引用指向子类代理对象时，调用private时，就无重写方法可以调用。
   */
  public void pay1() {
    //为了能开启事务
    this.a.decrement();
  }

  private void pay2() {
    //为了能开启事务
    this.a.decrement();
  }

  //扣除库存
  @Transactional(rollbackFor = Exception.class)
  public void decrement() {
    System.out.println("扣除库存成功");
  }

}
